package main

// 当然也是可以使用etcd来实现
// 创建一个服务来测试consul 的注册和发现

import (
	"fmt"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/micro/go-micro/v2/registry"
	"github.com/micro/go-micro/v2/web"
	"github.com/micro/go-plugins/registry/consul/v2"
)

var reg registry.Registry

func init() { // 初始化方法，会初始化时候加载
	// 初始化一个consul对象 注册到consul
	reg = consul.NewRegistry(registry.Addrs("127.0.0.1:8500"))
}

func InitWeb() *gin.Engine {
	r := gin.Default()
	r.GET("math/add", func(c *gin.Context) {
		x, _ := strconv.Atoi(c.Query("x"))
		y, _ := strconv.Atoi(c.Query("y"))
		z := x + y
		c.String(200, fmt.Sprintf("z=%d", z))
	})
	// 返回路由引擎
	return r
}

func main() {
	// 关于web的集群如何实现的问题，是否考虑使用负载代理实现
	// web 服务注册和发现 还有api 服务注册和发现， SRV的话可以使用rpc来注册发现
	go func() {
		service1 := web.NewService(
			web.Name("math_service_1"),     // 服务的名字
			web.Address("127.0.0.1:60000"), //  服务器发现的暴露端口
			web.Handler(InitWeb()),         // 服务处理逻辑
			web.Registry(reg),              // 服务注册
		)
		_ = service1.Run()
	}()

	service2 := web.NewService(
		web.Name("math_service_2"),     // 服务的名字
		web.Address("127.0.0.1:50000"), //  服务器发现的暴露端口
		web.Handler(InitWeb()),         // 服务处理逻辑
		web.Registry(reg),              // 服务注册
	)
	_ = service2.Run()

	// 并发注册运行

}

// 需要一个服务中心来实现所有的服务发现，服务中心支持可拓展性，然后通过服务中心来定向到不通过的web服务，不同的web服务再到srv
// 服务中心支持集群，以及心跳检测<检测web是否挂掉>，日志收集，RCBA处理等等一些中间件处理可以在服务中心来实现，
// 其他的web都是做负载用的，所有的请求必须经过服务中心在分配
// 服务与服务之间的交互可以通过服务发现来实现
// srv就是逻辑业务的实现，
